#ifndef _MSG_HPP_
#define _MSG_HPP_
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/msg.h>
#include<stdio.h>
#include<errno.h>
#include<unistd.h>
#include<string.h>
#include<iostream>
#define PATH_NAME "."//消息队列的路径
#define PROJ_ID 0x666//消息队列的自选id
#define SERVER_TYPE 1
#define CLIENT_TYPE 2
using namespace std;

struct msggbuf{
 long mtype;
 char mtext[1024];
};

int sendmsg(int msgid,int sendtype,char* msg)
{
    struct msggbuf buf;
    buf.mtype=sendtype;//消息队列的类型
    strcpy(buf.mtext,msg);
    if(msgsnd(msgid,&buf,sizeof(buf.mtext),0)<0)
    {
        perror("msgsnd error");
        exit(-1);
    }
return 0;
}

int receivemsg(int msgid,int receivetype,char out[])
{
    struct msggbuf buf;

    if(msgrcv(msgid,&buf,sizeof(buf.mtext),receivetype,0)<0)
    {
        perror("msgrcv error");
        exit(-1);
    }
    strcpy(out,buf.mtext);
    return 0;
}


int getmsghelper(int key,int flags)//总的获取消息队列函数
{
    int msgid=msgget(key,flags);
 if(msgid<0)//创建失败
 {
perror("getmsghelper error");
 }
 return msgid;
}

int creatmsg(int key)//创建消息队列--发送端调用
{
    getmsghelper(key,IPC_CREAT|IPC_EXCL| 0600);
}

int Getmsg(int key)//获取消息队列--接收端调用
{
    getmsghelper(key,IPC_CREAT);
}

key_t getkey()//获取key值
{
  key_t keynum=ftok(PATH_NAME,PROJ_ID);
  if(keynum<0)
  {
    perror("ftok error");
    exit(-1);
  }
  return keynum;
}

void deletemsg(int msgid)//删除消息队列
{
 if(msgctl(msgid,IPC_RMID,nullptr)<0)
 {
    perror("msgctl error");
    exit(-1);
 }
}

#endif